<?php
declare(strict_types=1);
namespace app\common\model;
use aphp\core\Model;
class Doc extends Model
{
	protected string $table = 'doc';
	protected string $pk = 'id';
	// 自动验证
	protected array $validate = [
        ['title', 'required', '文档标题必须', IF_MUST, AC_BOTH],
        ['sign', 'string|unique', '标识必须英文|标识已存在', IF_MUST, AC_BOTH],
        ['markdown', 'required', '内容必须', IF_MUST, AC_BOTH],
        ['sort', 'number', '排序值必须是数字', IF_MUST, AC_BOTH],
        ['ver_int', 'number', '版本号必须是数字', IF_MUST, AC_UPDATE],
    ];
	// 自动处理
    protected array $auto = [
        ['summary', 'getSummary', 'method', IF_EMPTY, AC_BOTH],
        ['ver_int', '1', 'string', IF_MUST, AC_INSERT],
        ['status', '1', 'string', IF_MUST, AC_INSERT],
    ];

    public function getSummary(string $val, array $data): string
    {
        return str_substr($data['html'], 120);
    }

    protected function _validate_where(array $data = []): array
    {
        return ['book_id' => $data['book_id']];
    }

    // 新增之前
    protected function _before_insert(array &$data): void
    {
        $data['user_id'] = session('user.id');
        // 上级目录
        if ($data['pid'] > 0) {
            $parent = $this->db->field('id,level,path')->where('id', $data['pid'])->find();
            if (!$parent) {
                $this->errors[] = '上级栏目不存在';
                return;
            }
            $data['level'] = $parent['level'] + 1; // 层次
            $data['path'] = $parent['path'].$parent['id'].','; // 路径
        }
    }

    // 新增之后
    protected function _after_insert(array $data): void
    {
        if ($data['pid'] > 0) {
            $this->db->where('id', $data['pid'])->setInc('sub_count'); // 子统计
        }
    }

    // 修改栏目
    protected function _before_update(array &$data): void
    {
        // 不同编辑者更新时
        $update_uid = session('user.id');
        if ($data['user_id'] != $update_uid) {
            $data['user_id'] = $update_uid;
            $data['ver_int'] ++; // 更新版本号
        }
        // 原pid  $this->data['pid'] 新pid $data['pid']
        if ($data['pid'] != $this->data['pid']) {
            if ($data['pid'] == $data['id']) {
                $this->errors[] = '上级栏目不能是自己';
                return;
            }
            if ($data['sub_count'] > 0) {
                $this->errors[] = '要移出子栏目后才能修改上级栏目';
                return;
            }
            if ($data['pid'] > 0) {
                // 当改为子目录
                $parent = $this->db->field('id,level,path')->where('id', $data['pid'])->find();
                if (!$parent) {
                    $this->errors[] = '上级栏目不存在';
                    return;
                }
                if (str_contains($parent['path'], ','.$data['id'].',')) {
                    $this->errors[] = '上级栏目不能是自己的子栏目';
                    return;
                }
                $data['level'] = $parent['level'] + 1; // 层次
                $data['path'] = $parent['path'].$parent['id'].','; // 路径
            } else {
                // 当改为根目录时
                $data['level'] = 0; // 层次
                $data['path'] = ','; // 路径
            }
        }

    }

    // 修改之后
    protected function _after_update(array $before, array $after): void
    {
        if ($before['pid'] != $after['pid']) {
            // 更新原来的
            if ($before['pid'] > 0) {
                $this->db->where('id', $before['pid'])->setDec('sub_count'); // 更新子统计
            }
            // 更新现在的
            if ($after['pid'] > 0) {
                $this->db->where('id', $after['pid'])->setInc('sub_count'); // 更新子统计
            }
        }
        if ($after['markdown'] != $before['markdown'] && $after['ver_int'] > $before['ver_int']) {
            // 存入旧版本
            $data = [];
            $data['doc_id'] = $before['id'];
            $data['book_id'] = $before['book_id'];
            $data['ver_int'] = $before['ver_int'];
            $find = db('doc_version')->where($data)->field('id')->find();
            if (!$find) {
                $data['markdown'] = $before['markdown'];
                $data['user_id'] = $before['user_id'];
                $data['change_ver'] = $after['ver_int'];
                $data['change_uid'] = $after['user_id'];
                $data['change_desc'] = $after['change_desc'] ?: 'v'.$data['ver_int'].' to v'. $data['change_ver'];
                $data['create_time'] = time();
                $data['status'] = 1;
                db('doc_version')->insert($data);
            }
        }
    }
}